#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
MUD客户端命令处理模块
负责解析和处理用户输入的命令
"""

import asyncio
import logging
from typing import TYPE_CHECKING

logger = logging.getLogger(__name__)

if TYPE_CHECKING:
    from ..client import MUDClient

class CommandHandler:
    """
    命令处理器
    负责解析和处理用户输入的命令
    """
    
    def __init__(self, client: 'MUDClient'):
        """
        初始化命令处理器
        
        Args:
            client: MUD客户端实例
        """
        self.client = client
        self.logger = logging.getLogger(__name__)
    
    def handle_input_command(self, user_input: str):
        """
        处理用户输入命令
        
        Args:
            user_input (str): 用户输入的文本
        """
        logger.debug(f"收到用户输入: {user_input}")
        
        # 解析用户输入并执行相应操作
        if user_input.startswith("#con"):
            self._handle_connect_command(user_input)
        elif user_input.startswith("#send"):
            self._handle_send_command(user_input)
        elif user_input in ["#quit", "#exit"]:
            self._handle_quit_command()
        else:
            # 将其他输入作为游戏命令处理
            self._handle_game_command(user_input)
    
    def _handle_connect_command(self, command: str):
        """
        处理连接命令
        
        Args:
            command (str): 连接命令字符串
        """
        # 解析命令参数
        parts = command.split()
        host = "mud.pkuxkx.net"  # 默认主机
        port = 8081  # 默认端口
        encoding = "utf-8"  # 默认编码
        
        if len(parts) >= 2:
            host = parts[1]
        if len(parts) >= 3:
            try:
                port = int(parts[2])
            except ValueError:
                logger.error("端口号必须是数字")
                self.client.ui.append_system_output("错误: 端口号必须是数字\n")
                return
        if len(parts) >= 4:
            encoding = parts[3]
        
        # 异步执行连接操作
        asyncio.create_task(self.client.connect(host, port, encoding))
    
    def _handle_send_command(self, command: str):
        """
        处理发送数据命令
        
        Args:
            command (str): 发送命令字符串
        """
        # 提取要发送的数据
        if " " in command:
            _, data = command.split(" ", 1)
            # 异步执行发送操作
            asyncio.create_task(self.client.send_command(data))
        else:
            logger.error("发送命令格式错误，应为: #send <data>")
            self.client.ui.append_system_output("错误: 发送命令格式错误，应为: #send <data>\n")
    
    def _handle_game_command(self, command: str):
        """
        处理游戏命令
        
        数据流处理规范：
        1. UI捕获输入：UI层捕获用户输入并通过回调传递给CommandHandler
        2. 命令处理：CommandHandler解析命令并调用MUDClient的send_command()方法
        3. 客户端转发：MUDClient调用Session的send_data()方法发送数据
        
        Args:
            command (str): 游戏命令
        """
        # 异步执行发送操作
        # 调用客户端的send_command方法，由客户端转发给Session发送
        asyncio.create_task(self.client.send_command(command))
    
    def _handle_quit_command(self):
        """
        处理退出命令
        """
        logger.info("正在退出程序...")
        # 异步执行断开连接操作
        asyncio.create_task(self._async_disconnect())
    
    async def _async_disconnect(self):
        """
        异步执行断开连接操作
        """
        await self.client.disconnect()
        self.client.stop()